{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pride & Prejudice analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Real text analysis\n",
    "\n",
    "We got familiar with Spacy. In the next section we are going to analyse a real text (Pride & Prejudice). \n",
    "\n",
    "We would like to:\n",
    "* Extract the names of all the characters from the book (e.g. Elizabeth, Darcy, Bingley)\n",
    "* Visualize characters' occurences with regards to relative position in the book\n",
    "* Authomatically describe any character from the book\n",
    "* Find out which characters have been mentioned in a context of marriage\n",
    "* Build keywords extraction that could be used to display a word cloud ([example](http://www.cytora.com/data-samples.html))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load text file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def read_file(file_name):\n",
    "    with open(file_name, 'r') as file:\n",
    "        return file.read().decode('utf-8')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Process full text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import spacy\n",
    "\n",
    "nlp = spacy.load('en')\n",
    "\n",
    "# Process `text` with Spacy NLP Parser\n",
    "text = read_file('data/pride_and_prejudice.txt')\n",
    "processed_text = nlp(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6138\n",
      "[\"My dear Mr. Bennet,\" said his lady to him one day, \"have you heard that\n",
      "Netherfield Park is let at last?\"\n",
      "\n",
      ", Mr. Bennet replied that he had not.\n",
      "\n",
      "\", But it is,\" returned she; \"for Mrs. Long has just been here, and she\n",
      "told me all about it.\"\n",
      "\n",
      ", Mr. Bennet made no answer.\n",
      "\n",
      ", \"Do you not want to know who has taken it?\" cried his wife impatiently.\n",
      "\n",
      "]\n"
     ]
    }
   ],
   "source": [
    "# How many sentences are in the book (Pride & Prejudice)?\n",
    "sentences = [s for s in processed_text.sents]\n",
    "print(len(sentences))\n",
    "\n",
    "# Print sentences from index 10 to index 15, to make sure that we have parsed the correct book\n",
    "print(sentences[10:15])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Find all the personal names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(u'elizabeth', 622), (u'darcy', 312), (u'jane', 286), (u'bennet', 266), (u'bingley', 204), (u'wickham', 183), (u'collins', 178), (u'lydia', 162), (u'lizzy', 94), (u'gardiner', 92), (u'lady catherine', 71), (u'kitty', 71), (u'mary', 36), (u'william', 33), (u'hurst', 32), (u'phillips', 30), (u'forster', 26), (u'longbourn', 26), (u'miss bingley', 25), (u'lucas', 21)]\n"
     ]
    }
   ],
   "source": [
    "# Extract all the personal names from Pride & Prejudice and count their occurrences. \n",
    "# Expected output is a list in the following form: [('elizabeth', 622), ('darcy', 312), ('jane', 286), ('bennet', 266) ...].\n",
    "\n",
    "from collections import Counter, defaultdict\n",
    "\n",
    "def find_character_occurences(doc):\n",
    "    \"\"\"\n",
    "    Return a list of actors from `doc` with corresponding occurences.\n",
    "    \n",
    "    :param doc: Spacy NLP parsed document\n",
    "    :return: list of tuples in form\n",
    "        [('elizabeth', 622), ('darcy', 312), ('jane', 286), ('bennet', 266)]\n",
    "    \"\"\"\n",
    "    \n",
    "    characters = Counter()\n",
    "    for ent in processed_text.ents:\n",
    "        if ent.label_ == 'PERSON':\n",
    "            characters[ent.lemma_] += 1\n",
    "            \n",
    "    return characters.most_common()\n",
    "\n",
    "print(find_character_occurences(processed_text)[:20])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot characters personal names as a time series "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/andrazhribernik/cytora/pycon-nlp-in-10-lines/venv/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n",
      "  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n"
     ]
    }
   ],
   "source": [
    "# Matplotlib Jupyter HACK\n",
    "%matplotlib inline\n",
    "\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Plot characters' mentions as a time series relative to the position of the actor's occurrence in a book.\n",
    "\n",
    "def get_character_offsets(doc):\n",
    "    \"\"\"\n",
    "    For every character in a `doc` collect all the occurences offsets and store them into a list. \n",
    "    The function returns a dictionary that has actor lemma as a key and list of occurences as a value for every character.\n",
    "    \n",
    "    :param doc: Spacy NLP parsed document\n",
    "    :return: dict object in form\n",
    "        {'elizabeth': [123, 543, 4534], 'darcy': [205, 2111]}\n",
    "    \"\"\"\n",
    "    \n",
    "    character_offsets = defaultdict(list)\n",
    "    for ent in doc.ents:\n",
    "        if ent.label_ == 'PERSON':\n",
    "            character_offsets[ent.lemma_].append(ent.start)\n",
    "            \n",
    "    return dict(character_offsets)\n",
    "\n",
    "character_occurences = get_character_offsets(processed_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11c4dec50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib.pyplot import hist\n",
    "from cycler import cycler\n",
    "\n",
    "NUM_BINS = 10\n",
    "\n",
    "def normalize(occurencies, normalization_constant):\n",
    "    return [o / float(len(processed_text)) for o in occurencies]\n",
    "\n",
    "def plot_character_timeseries(character_offsets, character_labels, normalization_constant=None):\n",
    "    \"\"\"\n",
    "    Plot characters' personal names specified in `character_labels` list as time series.\n",
    "    \n",
    "    :param character_offsets: dict object in form {'elizabeth': [123, 543, 4534], 'darcy': [205, 2111]}\n",
    "    :param character_labels: list of strings that should match some of the keys in `character_offsets`\n",
    "    :param normalization_constant: int\n",
    "    \"\"\"\n",
    "    x = [character_offsets[character_label] for character_label in character_labels] \n",
    "        \n",
    "    with plt.style.context('fivethirtyeight'):\n",
    "        plt.figure()\n",
    "        n, bins, patches = plt.hist(x, NUM_BINS, label=character_labels)\n",
    "        plt.clf()\n",
    "        \n",
    "        ax = plt.subplot(111)\n",
    "        for i, a in enumerate(n):\n",
    "            ax.plot([float(x) / (NUM_BINS - 1) for x in range(len(a))], a, label=character_labels[i])\n",
    "            \n",
    "        matplotlib.rcParams['axes.prop_cycle'] = cycler(color=['r','k','c','b','y','m','g','#54a1FF'])\n",
    "        ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))\n",
    "\n",
    "#plot_character_timeseries(character_occurences, ['darcy', 'bingley'], normalization_constant=len(processed_text))\n",
    "plot_character_timeseries(character_occurences, ['darcy', 'bingley'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spacy parse tree in action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[u'silent', u'such', u'much', u'his', u'his', u'what', u'charming', u'young', u'grave', u'her', u'his', u'particular', u'disappointing', u'late', u'late', u'late', u'late', u'intimate', u'confidential', u'present', u'her', u'much', u'his', u'her', u'your', u'late', u'late', u'present', u'abominable', u'all', u'late', u'poor', u'handsome', u'her', u'last', u'her', u'her', u'little', u'his', u'disagreeable', u'clever', u'worth', u'little', u'grow', u'studious', u'sorry', u'unworthy', u'answerable', u'unappeasable', u'impatient', u'ashamed', u'kind', u'proud', u'tall', u'punctual', u'engaged', u'fond']\n"
     ]
    }
   ],
   "source": [
    "# Find words (adjectives) that describe Mr. Darcy.\n",
    "\n",
    "def get_character_adjectives(doc, character_lemma):\n",
    "    \"\"\"\n",
    "    Find all the adjectives related to `character_lemma` in `doc`\n",
    "    \n",
    "    :param doc: Spacy NLP parsed document\n",
    "    :param character_lemma: string object\n",
    "    :return: list of adjectives related to `character_lemma`\n",
    "    \"\"\"\n",
    "    \n",
    "    adjectives = []\n",
    "    for ent in processed_text.ents:\n",
    "        if ent.lemma_ == character_lemma:\n",
    "            for token in ent.subtree:\n",
    "                if token.pos_ == 'ADJ': # Replace with if token.dep_ == 'amod':\n",
    "                    adjectives.append(token.lemma_)\n",
    "    \n",
    "    for ent in processed_text.ents:\n",
    "        if ent.lemma_ == character_lemma:\n",
    "            if ent.root.dep_ == 'nsubj':\n",
    "                for child in ent.root.head.children:\n",
    "                    if child.dep_ == 'acomp':\n",
    "                        adjectives.append(child.lemma_)\n",
    "    \n",
    "    return adjectives\n",
    "\n",
    "print(get_character_adjectives(processed_text, 'darcy'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(u'Elizabeth', 42), (u'Bennet', 30), (u'Jane', 15), (u'Miss Bingley', 9), (u'Lizzy', 6), (u'Gardiner', 5), (u'Lydia', 4), (u'Darcy', 4), (u'Wickham', 4), (u'Bingley', 4)]\n"
     ]
    }
   ],
   "source": [
    "# Find characters that are 'talking', 'saying', 'doing' the most. Find the relationship between \n",
    "# entities and corresponding root verbs.\n",
    "\n",
    "character_verb_counter = Counter()\n",
    "VERB_LEMMA = 'say'\n",
    "\n",
    "for ent in processed_text.ents:\n",
    "    if ent.label_ == 'PERSON' and ent.root.head.lemma_ == VERB_LEMMA:\n",
    "        character_verb_counter[ent.text] += 1\n",
    "\n",
    "print(character_verb_counter.most_common(10)) \n",
    "        \n",
    "# Find all the characters that got married in the book.\n",
    "#\n",
    "# Here is an example sentence from which this information could be extracted:\n",
    "# \n",
    "# \"her mother was talking to that one person (Lady Lucas) freely,\n",
    "# openly, and of nothing else but her expectation that Jane would soon\n",
    "# be married to Mr. Bingley.\"\n",
    "#\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extract Keywords"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(u'al - qaeda', 3),\n",
       " (u'terrorism', 3),\n",
       " (u'religion', 2),\n",
       " (u'the responsibility', 2),\n",
       " (u'excommunication', 2),\n",
       " (u'saudi arabia', 2),\n",
       " (u'the ministry', 2),\n",
       " (u'interior', 2),\n",
       " (u'many country', 2),\n",
       " (u'all gulf , arab', 1),\n",
       " (u'concept', 1),\n",
       " (u'the sykes - picot agreement', 1),\n",
       " (u'even international effort', 1),\n",
       " (u'ramadan', 1),\n",
       " (u'recent month', 1),\n",
       " (u'no place', 1),\n",
       " (u'official and non - official religious institution', 1),\n",
       " (u'tyrant', 1),\n",
       " (u'scientific critique', 1),\n",
       " (u'misconception', 1)]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Extract Keywords using noun chunks from the news article (file 'article.txt').\n",
    "# Spacy will pick some noun chunks that are not informative at all (e.g. we, what, who).\n",
    "# Try to find a way to remove non informative keywords.\n",
    "\n",
    "article = read_file('data/article.txt')\n",
    "doc = nlp(article)\n",
    "\n",
    "keywords = Counter()\n",
    "for chunk in doc.noun_chunks:\n",
    "    if nlp.vocab[chunk.lemma_].prob < - 8: # probablity value -8 is arbitrarily selected threshold\n",
    "        keywords[chunk.lemma_] += 1\n",
    "\n",
    "keywords.most_common(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
